package com.sxf.redis.iredis;

import java.util.List;
import java.util.Set;

/**
 * 
 * @description: set的工具类
 * @author: zhangyb@ccccit.com.cn 
 * @date: 2021年1月5日 下午2:23:07
 */
public interface ISetRedisUtils {

	/**
	 * 添加元素
	 * @param nameSpace
	 * @param key
	 * @param timeoutSeconds
	 * @param values
	 * @return
	 */
	boolean addSet(String nameSpace, String key, long timeoutSeconds, Object[] values);

	/**
	 * 添加元素
	 * @param key
	 * @param timeoutSeconds
	 * @param values
	 * @return
	 */
	default boolean addSet(String key, long timeoutSeconds, Object[] values) {
		return addSet(null, key, timeoutSeconds, values);
	}

	/**
	 * 添加元素
	 * @param nameSpace
	 * @param key
	 * @param timeoutSeconds
	 * @param value
	 * @return
	 */
	default boolean addSet(String nameSpace, String key, long timeoutSeconds, Object value) {
		return addSet(nameSpace, key, timeoutSeconds, new Object[] { value });
	}

	/**
	 * 添加元素
	 * @param key
	 * @param timeoutSeconds
	 * @param value
	 * @return
	 */
	default boolean addSet(String key, long timeoutSeconds, Object value) {
		return addSet(null, key, timeoutSeconds, new Object[] { value });
	}

	/**
	 * 求差集
	 * @param nameSpace
	 * @param keys
	 * @return
	 */
	Set<Object> difference(String nameSpace, List<String> keys);

	/**
	 * 求差集
	 * @param keys
	 * @return
	 */
	default Set<Object> difference(List<String> keys) {
		return difference(null, keys);
	}

	/**
	 * 求1-2的差集
	 * @param nameSpace1
	 * @param key1
	 * @param nameSpace2
	 * @param key2
	 * @return
	 */
	Set<Object> difference(String nameSpace1, String key1, String nameSpace2, String key2);

	/**
	 * 求1-2的差集
	 * @param key1
	 * @param key2
	 * @return
	 */
	default Set<Object> difference(String key1, String key2) {
		return difference(null, key1, null, key2);
	}

	/**
	 * 求并集
	 * @param nameSpace
	 * @param keys
	 * @return
	 */
	Set<Object> intersection(String nameSpace, List<String> keys);

	/**
	 * 求并集
	 * @param keys
	 * @return
	 */
	default Set<Object> intersection(List<String> keys) {
		return intersection(null, keys);
	}

	/**
	 * 求1与2的并集
	 * @param nameSpace1
	 * @param key1
	 * @param nameSpace2
	 * @param key2
	 * @return
	 */
	Set<Object> intersection(String nameSpace1, String key1, String nameSpace2, String key2);

	/**
	 * 求1与2的并集
	 * @param key1
	 * @param key2
	 * @return
	 */
	default Set<Object> intersection(String key1, String key2) {
		return intersection(null, key1, null, key2);
	}

	/**
	 * 删除
	 * @param nameSpace
	 * @param key
	 * @param values
	 * @return
	 */
	boolean removeSet(String nameSpace, String key, Object[] values);

	/**
	 * 删除
	 * @param key
	 * @param values
	 * @return
	 */
	default boolean removeSet(String key, Object[] values) {
		return removeSet(null, key, values);
	}

	/**
	 * 删除
	 * @param nameSpace
	 * @param key
	 * @param value
	 * @return
	 */
	default boolean removeSet(String nameSpace, String key, Object value) {
		return removeSet(nameSpace, key, new Object[] { value });
	}

	/**
	 * 删除
	 * @param key
	 * @param value
	 * @return
	 */
	default boolean removeSet(String key, Object value) {
		return removeSet(null, key, new Object[] { value });
	}

	/**
	 * 清空
	 * @param nameSpace
	 * @param key
	 */
	void clearSet(String nameSpace, String key);

	/**
	 * 清空
	 * @param key
	 */
	default void clearSet(String key) {
		clearSet(null, key);
	}

	/**
	 * 获取大小
	 * @param nameSpace
	 * @param key
	 * @return
	 */
	int sizeSet(String nameSpace, String key);

	/**
	 * 清空
	 * @param key
	 * @return
	 */
	default int sizeSet(String key) {
		return sizeSet(null, key);
	}

	/**
	 * 获取全部
	 * @param nameSpace
	 * @param key
	 * @return
	 */
	Set<Object> readAllSet(String nameSpace, String key);

	/**
	 * 获取全部
	 * @param key
	 * @return
	 */
	default Set<Object> readAllSet(String key) {
		return readAllSet(null, key);
	}

	/**
	 * 判断是否为空
	 * @param nameSpace
	 * @param key
	 * @return
	 */
	boolean isEmptySet(String nameSpace, String key);

	/**
	 * 判断是否为空
	 * @param key
	 * @return
	 */
	default boolean isEmptySet(String key) {
		return isEmptySet(null, key);
	}

	/**
	 * 判断是否存在
	 * @param nameSpace
	 * @param key
	 * @return
	 */
	boolean isExistsSet(String nameSpace, String key);

	/**
	 * 判断是否存在
	 * @param key
	 * @return
	 */
	default boolean isExistsSet(String key) {
		return isExistsSet(null, key);
	}

}
